今天是第五天我們可以寫一個k8s資料庫管理大賣場系統,以下是我的程式碼
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
StatefulSet 確保每個副本的資料庫有穩定的網絡標識及持久存儲。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:latest
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
value: "store_db"
- name: POSTGRES_USER
value: "admin"
- name: POSTGRES_PASSWORD
value: "password"
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: postgres-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
apiVersion: v1
kind: Service
metadata:
name: postgres
spec:
ports:
- port: 5432
name: postgres
clusterIP: None
selector:
app: postgres
假設使用 Node.js 搭配 Express,應用將與資料庫交互,處理大賣場的業務邏輯,如庫存管理、訂單處理等。
將應用打包成容器,並部署到 Kubernetes。
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
apiVersion: apps/v1
kind: Deployment
metadata:
name: store-app
spec:
replicas: 3
selector:
matchLabels:
app: store-app
template:
metadata:
labels:
app: store-app
spec:
containers:
- name: store-app
image: your-repo/store-app:latest
ports:
- containerPort: 3000
env:
- name: DB_HOST
value: "postgres"
- name: DB_USER
value: "admin"
- name: DB_PASSWORD
value: "password"
- name: DB_NAME
value: "store_db"
apiVersion: v1
kind: Service
metadata:
name: store-service
spec:
selector:
app: store-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
透過 Ingress 來暴露應用外部訪問端點。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: store-ingress
spec:
rules:
- host: store.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: store-service
port:
number: 80
這段程式碼負責申請存儲空間,用於資料庫的持久性存儲。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
PersistentVolumeClaim
: 在 Kubernetes 中,PVC 用來向 Kubernetes 集群申請一塊持久性存儲,用來存儲資料庫數據,避免 Pod 重啟時資料丟失。name: postgres-pvc
: 定義這個 PVC 的名稱為 postgres-pvc
,後面將引用它。accessModes
: 指定存取模式,ReadWriteOnce
代表此存儲卷只能被一個節點同時讀寫。requests.storage
: 申請了 10GB 的存儲空間。這段程式碼用來部署 PostgreSQL 資料庫,確保資料庫的資料持久化,並且在重啟後依然保留數據。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:latest
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
value: "store_db"
- name: POSTGRES_USER
value: "admin"
- name: POSTGRES_PASSWORD
value: "password"
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: postgres-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
StatefulSet
: 為有狀態的應用程式設計,確保資料庫有固定的名稱和網絡標識,即使重啟也不會改變。replicas: 1
: 部署一個 PostgreSQL 資料庫副本,可以根據需求調整為多副本。template.metadata.labels
: 用來標記這個 Pod,這裡是 app: postgres
,後續的 Service 會根據這個標籤找到對應的 Pod。image: postgres:latest
: 指定使用 PostgreSQL 的最新版本映像。containerPort: 5432
: 指定 PostgreSQL 的默認端口,5432 是 PostgreSQL 預設的數據庫通信端口。env
: 設定 PostgreSQL 資料庫的環境變數,包括資料庫名稱 (POSTGRES_DB
),用戶名 (POSTGRES_USER
),以及密碼 (POSTGRES_PASSWORD
)。volumeMounts
: 把之前的 PVC(postgres-storage
)掛載到容器的 /var/lib/postgresql/data
目錄,這是 PostgreSQL 用來存儲數據的地方,保證資料不會因為容器重啟而丟失。volumeClaimTemplates
: 定義存儲卷模版,確保每個 PostgreSQL 副本都有自己獨立的存儲空間。這段程式碼是用來提供 PostgreSQL 的網路服務,使其他 Pod 能夠通過這個 Service 與 PostgreSQL 進行通訊。
apiVersion: v1
kind: Service
metadata:
name: postgres
spec:
ports:
- port: 5432
name: postgres
clusterIP: None
selector:
app: postgres
Service
: Kubernetes 中的 Service 負責為 Pod 提供一個穩定的網絡接口,無論 Pod 重啟或是更新,應用都可以通過這個接口來訪問它。port: 5432
: Service 對外暴露 PostgreSQL 的端口 5432,使其他應用可以通過這個端口連接資料庫。clusterIP: None
: 表示這是一個 headless service,與 StatefulSet 一起使用,允許直接連接到 Pod。selector
: 指定這個 Service 要連接的 Pod(標籤為 app: postgres
的 Pod)。這段程式碼定義了大賣場的應用層,使用 Node.js 並與資料庫進行交互。
apiVersion: apps/v1
kind: Deployment
metadata:
name: store-app
spec:
replicas: 3
selector:
matchLabels:
app: store-app
template:
metadata:
labels:
app: store-app
spec:
containers:
- name: store-app
image: your-repo/store-app:latest
ports:
- containerPort: 3000
env:
- name: DB_HOST
value: "postgres"
- name: DB_USER
value: "admin"
- name: DB_PASSWORD
value: "password"
- name: DB_NAME
value: "store_db"
Deployment
: 負責管理應用程式的多副本部署。當某個應用崩潰或需要更新時,Deployment 會確保應用程式保持可用。replicas: 3
: 定義了 3 個應用副本(Pod)來保證高可用性。如果有 Pod 崩潰,Kubernetes 會自動重新啟動一個新的 Pod。image: your-repo/store-app:latest
: 指定應用使用的容器映像。可以將你的 Node.js 應用打包成 Docker 映像,並推送到容器註冊庫(例如 Docker Hub),然後在這裡引用它。containerPort: 3000
: 指定應用運行的端口,這裡是 3000(Node.js 應用常用的端口)。env
: 設定資料庫的連接信息,DB_HOST
為資料庫服務的地址(即我們之前定義的 postgres
Service),其他環境變數包括資料庫用戶、密碼和名稱。這段程式碼為應用程式創建一個 LoadBalancer,使外部用戶可以訪問應用。
apiVersion: v1
kind: Service
metadata:
name: store-service
spec:
selector:
app: store-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
Service
: 同樣是一個 Kubernetes 服務,用來將應用層暴露給外部用戶訪問。port: 80
: 這裡指定 Service 對外暴露的端口是 80,這是網頁服務常用的端口。targetPort: 3000
: 這裡的 3000
是應用程式內部的端口,這意味著 Service 接收的流量將被轉發到應用的 3000 端口。type: LoadBalancer
: 定義服務類型為 LoadBalancer,這會在雲平台上自動創建負載均衡器,將外部流量分配到多個應用副本。Ingress 用來設定應用的域名和路徑路由,允許外部用戶通過指定的域名來訪問應用。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: store-ingress
spec:
rules:
- host: store.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: store-service
port:
number: 80
Ingress
: 這個資源允許你通過域名 (store.example.com
) 將外部請求路由到 Kubernetes 內部的服務(store-service
)。host
: 指定了訪問應用的域名,這需要和 DNS 設置一起使用。path
: 定義了當用戶訪問 /
路徑時,流量應該被轉發到 store-service
的 80 端口。PVC**: 為 PostgreSQL 資料庫申請 10GB 的持久性存儲。